package com.tianjin.design.visitor;

/**
 * @Description: 访问者模式# 行为型模式
 * 1、解释：官方定义是这样的，表示一个作用于某对象结构中的各元素的操作，它使你可以在不改变各元素的类的前提下定义作用这些元素的新操作。
 *      此定义着实抽象，我是这么理解的，就是说有一个类，类里边有多个元素（属性），针对于操作这些元素的任何一类操作都可以在不改变元素的基础上通过
 *      继承的方式进行扩展，也就是将类的属性和对属性进行的操作分离。
 *      这样就有了一个前提，就是说这个类的元素最好是固定的，不经常改变的，因为针对于类中的属性的一类操作会随着元素的改变而改变，
 *      所以如果元素经常性改变，则操作也许对应改变，不符合开闭原则。
 * 2、使用场景：直接举个例子，自己来思考，可能不是很恰当。
 *      每个人都有手、脚，就可以认为对于人来说这两类元素（属性）是不经常改变的，对于如何处理洗手、洗脚；戴手套、穿袜子；等一系列操作
 *      是不同的，并且还可能会有其他操作是不确定的，这时候可以考虑使用访问者模式，每一类对类元素的操作都是一个访问者。
 *
 *  3、代码开发。
 *      3-1 先定义操作的对象类，确定操作的元素 ，这里定义 PeopleElement
 *          声明具体实现类，也就是固定的几个元素对应的类 ElementHand、ELmentLeg
 *      3-2 定义访问者抽象类 PeopleElementVisitor，定义对每一个类元素的操作
 *      3-3 此时访问者模式的架构代码我认为已经基本完成
 *      3-4 现在实现具体的行为代码，例如先加一个洗的操作,也就是加一个洗手、洗脚的访问者者 WaterPeopleElementVisitor
 *      3-5 对手、脚要进行AA操作或者BB操作，此时便可以继续添加访问者 AAPeopleElementVisitor,BBPeopleElementVisitor，非常容易扩展
 *      3-6 客户端使用如下main
 *
 */
public class Test {

    public static void main(String[] args) {

        PeopleElement element = new ElementHand();
        element.accept(new WaterPeopleElementVisitor());
        // ... .可以继续添加更多针对于hand的操作

    }

}
